﻿using System.Diagnostics.Contracts;
using System.Reactive.Concurrency;

namespace System.Reactive.Subjects
{
	public static class Subject
	{
		public static ISubject<TSource, TResult> Create<TSource, TResult>(IObserver<TSource> observer, IObservable<TResult> observable)
		{
			Contract.Requires(observer != null, null, "observer != null");
			Contract.Requires(observable != null, null, "observable != null");
			Contract.Ensures(Contract.Result<ISubject<TSource, TResult>>() != null, null, "Contract.Result<ISubject<TSource, TResult>>() != null");
			return null;
		}

		public static ISubject<TSource, TResult> Synchronize<TSource, TResult>(ISubject<TSource, TResult> subject)
		{
			Contract.Requires(subject != null, null, "subject != null");
			Contract.Ensures(Contract.Result<ISubject<TSource, TResult>>() != null, null, "Contract.Result<ISubject<TSource, TResult>>() != null");
			return null;
		}

		public static ISubject<TSource, TResult> Synchronize<TSource, TResult>(ISubject<TSource, TResult> subject, IScheduler scheduler)
		{
			Contract.Requires(subject != null, null, "subject != null");
			Contract.Requires(scheduler != null, null, "scheduler != null");
			Contract.Ensures(Contract.Result<ISubject<TSource, TResult>>() != null, null, "Contract.Result<ISubject<TSource, TResult>>() != null");
			return null;
		}
	}
}